import sys
import os
import time
from doc_utils import read_paragraphs
from punctuation_validation import validate_paragraph_endings, validate_with_resplit
from deepseek_api import compare_paragraphs_with_deepseek, test_api_connection, APIRetryExhaustedError
from checkpoint import save_checkpoint, load_checkpoint, remove_checkpoint
from para_excel_export import export_to_excel


def compare_documents(doc_cn_path, doc_en_path):
    """比较两个文档的段落结构和内容"""
    # 加载检查点
    checkpoint = load_checkpoint()
    start_index = checkpoint["position"] if checkpoint else 0

    # 读取段落
    try:
        doc_cn_paras = read_paragraphs(doc_cn_path)
        doc_en_paras = read_paragraphs(doc_en_path)
    except Exception as e:
        print(f"文档读取错误: {e}")
        sys.exit(1)

    # 关键优化：首先检查段落数量是否匹配
    if len(doc_cn_paras) == len(doc_en_paras):
        # 如果段落数量匹配，删除检查点
        remove_checkpoint()
        print("✅ 两个文档段落数量相同，校验通过")

        # 只有在段落数量匹配时才输出Excel对照文件
        user_choice = input("是否导出段落对照表到Excel进行人工检查？(y/n): ")
        if user_choice.lower() == 'y':
            export_file = export_to_excel(doc_cn_path, doc_en_path)
            print(f"✅ 已导出段落对照表到: {export_file}")
        else:
            print("未导出Excel对照文件")

        return True

    # 段落数比较
    print(f"⚠️ 段落数量不同: 中文文档={len(doc_cn_paras)}段, 英文文档={len(doc_en_paras)}段")

    # 确定比较范围
    compare_count = min(len(doc_cn_paras), len(doc_en_paras))
    print(f"开始从段落 {start_index + 1} 到 {compare_count} 的内容比较...")

    # 比较内容
    try:
        for i in range(start_index, compare_count):
            para_cn = doc_cn_paras[i]
            para_en = doc_en_paras[i]

            print(f"\n🔍 比较段落 {i + 1}/{compare_count}:")
            print(f"中文: {para_cn[:100]}{'...' if len(para_cn) > 100 else ''}")
            print(f"英文: {para_en[:100]}{'...' if len(para_en) > 100 else ''}")

            # 1. 首先进行结束符号校验
            if validate_paragraph_endings(para_cn, para_en, i):
                # 结束符号匹配，进入下一段
                continue

            # 2. 结束符号不匹配，尝试使用DeepSeek重新分句
            if validate_with_resplit(para_cn, para_en, i):
                # 重新分句后匹配成功，进入下一段
                continue

            # 3. 结束符号校验失败，进行语义校验
            print("结束符号校验失败，进行语义校验...")
            if compare_paragraphs_with_deepseek(para_cn, para_en):
                print("✅ 内容匹配（尽管结束符号不匹配）")
            else:
                print("❌ 内容不匹配!")
                print(f"\n=== 详细内容 ===")
                print(f"中文段落 {i + 1}: {para_cn}")
                print(f"英文段落 {i + 1}: {para_en}")
                print("=" * 50)

                # 保存检查点
                save_checkpoint(i, doc_cn_path, doc_en_path)
                print(f"\n已保存检查点到段落 {i + 1}，请修改文档后重新运行程序")
                return False

    except APIRetryExhaustedError as e:
        print(f"\n❌ 严重错误: {e}")
        print("API请求失败且重试次数耗尽，程序将停止运行")
        save_checkpoint(i, doc_cn_path, doc_en_path)
        print(f"已保存检查点到段落 {i + 1}，请解决API问题后重新运行程序")
        sys.exit(1)
    except Exception as e:
        print(f"\n❌ 比较过程中发生错误: {e}")
        save_checkpoint(i, doc_cn_path, doc_en_path)
        print(f"已保存检查点到段落 {i + 1}，请修复问题后重新运行程序")
        sys.exit(1)

    # 检查段落数量差异
    if len(doc_cn_paras) != len(doc_en_paras):
        diff_position = min(len(doc_cn_paras), len(doc_en_paras))
        print(f"\n❌ 段落数量不一致，从段落 {diff_position + 1} 开始:")
        if len(doc_cn_paras) > len(doc_en_paras):
            print(f"中文文档多出 {len(doc_cn_paras) - len(doc_en_paras)} 段")
            print("多出内容:" + doc_cn_paras[diff_position][:200] + "...")
        else:
            print(f"英文文档多出 {len(doc_en_paras) - len(doc_cn_paras)} 段")
            print("多出内容:" + doc_en_paras[diff_position][:200] + "...")

        save_checkpoint(diff_position, doc_cn_path, doc_en_path)
        print(f"\n已保存检查点到段落 {diff_position + 1}，请修改文档后重新运行程序")
        return False

    # 所有检查通过
    remove_checkpoint()
    print("✅ 所有段落内容匹配")

    # 在完成所有校验后也提供导出Excel的选项
    user_choice = input("是否导出段落对照表到Excel进行人工检查？(y/n): ")
    if user_choice.lower() == 'y':
        export_file = export_to_excel(doc_cn_path, doc_en_path)
        print(f"✅ 已导出段落对照表到: {export_file}")
    else:
        print("未导出Excel对照文件")

    return True


def main():
    # 文件路径
    doc_cn_path = "./test/历史、重组及公司架构/5 中文招股书——历史、重组及公司架构.docx"
    doc_en_path = "./test/历史、重组及公司架构/5 英文招股书——历史、重组及公司架构.docx"

    print("=" * 50)
    print("双语文档一致性检查系统")
    print("=" * 50)

    # 测试API连接
    if not test_api_connection():
        print("API连接测试失败，程序退出")
        sys.exit(1)

    # 加载检查点
    checkpoint = load_checkpoint()
    if checkpoint:
        print(f"检测到未完成的检查点 (段落 {checkpoint['position'] + 1})")
        doc_cn_path = checkpoint.get("doc_cn", doc_cn_path)
        doc_en_path = checkpoint.get("doc_en", doc_en_path)

    # 执行比较
    try:
        success = compare_documents(doc_cn_path, doc_en_path)
    except Exception as e:
        print(f"\n❌ 程序执行出错: {e}")
        sys.exit(1)

    if success:
        print("\n检查完成: 所有内容一致!")
    else:
        print("\n请修改文档后重新运行本程序继续检查")


if __name__ == "__main__":
    main()